package dao;

import java.util.Date;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import dominio.Cliente;
import dominio.Cotizacion;
import dominio.ItemPedido;
import dominio.OrdenPedido;
import dominio.Pedido;
import dominio.Rodamiento;
import utils.DateUtils;
import utils.XmlUtils;

public class OrdenPedidoXmlDAO {
	private static OrdenPedidoXmlDAO instance;

	public static OrdenPedidoXmlDAO getInstance() {
		if (instance == null)
			instance = new OrdenPedidoXmlDAO();
		return instance;
	}

	private OrdenPedidoXmlDAO() {}

	public OrdenPedido parse(Document xml) throws Exception {
		// OrdenDePedido
		Element elementOrden = XmlUtils.getElement(xml, "OrdenDePedido");
		if (elementOrden != null) {
			OrdenPedido orden = new OrdenPedido();
			// Fecha
			Date fecha = DateUtils.parse(elementOrden.getAttribute("fecha"));
			orden.setFecha(fecha);
			// Cliente
			Cliente cliente = XmlUtils.parseCliente(elementOrden);
			orden.setCliente(cliente);
			// Pedidos
			Element elementReferencia = XmlUtils.getElement(elementOrden, "Referencia");
			if (elementReferencia != null) {
				NodeList cotizaciones = elementReferencia.getElementsByTagName("Cotizacion");
				for (int i = 0; i < cotizaciones.getLength(); ++i)
					orden.agregarPedido(parsePedido((Element) cotizaciones.item(i)));
				return orden;
			}
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}

	private Pedido parsePedido(Element elementCotizacion) throws Exception {
		Pedido pedido = new Pedido();
		// Cotizacion
		Cotizacion cotizacion = new Cotizacion();
		cotizacion.setId(Integer.parseInt(elementCotizacion.getAttribute("numero")));
		pedido.setCotizacion(cotizacion);
		// Rodamientos
		Element elementRodamientos = XmlUtils.getElement(elementCotizacion, "Rodamientos");
		if (elementRodamientos == null)
			throw new Exception("Formato incorrecto del archivo XML.");
		NodeList items = elementRodamientos.getElementsByTagName("Item");
		for (int i = 0; i < items.getLength(); ++i) {
			Element elementItem = (Element) items.item(i);
			ItemPedido item = parseItem(elementItem);
			pedido.agregarItem(item);
		}
		return pedido;
	}

	private ItemPedido parseItem(Element item) throws Exception {
		// Serie
		String serie = item.getAttribute("serie");
		// Sufijo
		Element elementSufijo = XmlUtils.getElement(item, "Sufijo");
		// Marca
		Element elementMarca = XmlUtils.getElement(item, "Marca");
		// Pais
		Element elementPais = XmlUtils.getElement(item, "Origen");
		// Cantidad
		Element elementCantidad = XmlUtils.getElement(item, "Cantidad");
		if (serie != null && elementSufijo != null && elementMarca != null && elementPais != null && elementCantidad != null) {
			ItemPedido i = new ItemPedido();
			// Rodamiento
			Rodamiento r = new Rodamiento();
			r.setSerie(serie);
			r.setSufijo(elementSufijo.getTextContent());
			r.setMarca(elementMarca.getTextContent());
			r.setPais(elementPais.getTextContent());
			i.setRodamiento(r);
			// Cantidad
			i.setCantidad(Integer.parseInt(elementCantidad.getTextContent()));
			return i;
		}
		throw new Exception("Formato incorrecto del archivo XML.");
	}
}